Public Declare Auto Function SetCursorPos Lib "User32.dll" (ByVal X As Integer, ByVal Y As Integer) As Long
    Public Declare Auto Function GetCursorPos Lib "User32.dll" (ByRef lpPoint As Point) As Long
    Public Declare Sub MouseEvent Lib "user32" Alias "mouse_event" (ByVal dwFlags As MouseEventFlags, _
    ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
    Public Enum MouseEventFlags
        LeftDown = &H2
        LeftUp = &H4
        MiddleDown = &H20
        MiddleUp = &H40
        RightDown = &H8
        RightUp = &H10
    End Enum
    Public Enum ButtonType : LeftClick : MiddleClick : RightClick : End Enum
    Public Shared Sub SendClick(ByVal CursorButton As ButtonType, ByVal XPosition As Integer, _
    ByVal YPosition As Integer, Optional ByVal RestorePosition As Boolean = False)
        Dim OriginalX, OriginalY As Integer
        OriginalX = Windows.Forms.Cursor.Position.X.ToString
        OriginalY = Windows.Forms.Cursor.Position.Y.ToString
        Select Case CursorButton
            Case ButtonType.LeftClick
                Select Case RestorePosition
                    Case True
                        SetCursorPos(XPosition, YPosition)
                        MouseEvent(MouseEventFlags.LeftDown, 0, 0, 0, 0)
                        MouseEvent(MouseEventFlags.LeftUp, 0, 0, 0, 0)
                        SetCursorPos(OriginalX, OriginalY)
                    Case False
                        SetCursorPos(XPosition, YPosition)
                        MouseEvent(MouseEventFlags.LeftDown, 0, 0, 0, 0)
                        MouseEvent(MouseEventFlags.LeftUp, 0, 0, 0, 0)
                End Select
            Case ButtonType.MiddleClick
                Select Case RestorePosition
                    Case True
                        SetCursorPos(XPosition, YPosition)
                        MouseEvent(MouseEventFlags.MiddleDown, 0, 0, 0, 0)
                        MouseEvent(MouseEventFlags.MiddleUp, 0, 0, 0, 0)
                        SetCursorPos(OriginalX, OriginalY)
                    Case False
                        SetCursorPos(XPosition, YPosition)
                        MouseEvent(MouseEventFlags.MiddleDown, 0, 0, 0, 0)
                        MouseEvent(MouseEventFlags.MiddleUp, 0, 0, 0, 0)
                End Select
            Case ButtonType.RightClick
                Select Case RestorePosition
                    Case True
                        SetCursorPos(XPosition, YPosition)
                        MouseEvent(MouseEventFlags.RightDown, 0, 0, 0, 0)
                        MouseEvent(MouseEventFlags.RightUp, 0, 0, 0, 0)
                        SetCursorPos(OriginalX, OriginalY)
                    Case False
                        SetCursorPos(XPosition, YPosition)
                        MouseEvent(MouseEventFlags.RightDown, 0, 0, 0, 0)
                        MouseEvent(MouseEventFlags.RightUp, 0, 0, 0, 0)
                End Select
        End Select
    End Sub
    Public Shared Sub SendClick(ByVal CursorButton As ButtonType)
        Select Case CursorButton
            Case ButtonType.LeftClick
                MouseEvent(MouseEventFlags.LeftDown, 0, 0, 0, 0)
                MouseEvent(MouseEventFlags.LeftUp, 0, 0, 0, 0)
            Case ButtonType.MiddleClick
                MouseEvent(MouseEventFlags.MiddleDown, 0, 0, 0, 0)
                MouseEvent(MouseEventFlags.MiddleUp, 0, 0, 0, 0)
            Case ButtonType.RightClick
                MouseEvent(MouseEventFlags.RightDown, 0, 0, 0, 0)
                MouseEvent(MouseEventFlags.RightUp, 0, 0, 0, 0)
        End Select
    End Sub